<?php defined('SYSPATH') OR die('No direct access allowed.');

class ArvoreSintatica extends Core_Sintatico {

	protected $arvore;
	protected $arvoreYahoo;
	protected $indice;
	protected $sintatico;
	
	public function __construct($sintatico){
		$this->arvore = array();
		$this->indice = 0;
		$this->sintatico = $sintatico;
		$this->arvore = $this->geraArvore($this->sintatico->getSaida());
		$this->arvoreYahoo = $this->geraArvoreParaYahooTree($this->sintatico->getSaida(), 'tree.getRoot()');
	}
	
	public function geraArvore(&$saida){
		$result = '';
		if($saida!=null){
			$regra = array_shift($saida);
			$producoes = $this->regras[$regra];
			$nome = $this->regrasByName[$regra];
			$result = '<ul>'.htmlentities($nome);
			//echo $nome.'['.$regra.']'."\n";
			//var_dump($saida);
			for($i=0; $i< count($producoes); $i++) {
				$producao = $producoes[$i];
				//echo 'regra='.$regra.' indice i='.$i.' do elemento'.$nome.' producao atual='.$producao."\n";
				//var_dump($producoes);
				//echo '>'.$producao."\n";
				if(in_array($producao, $this->regrasByName)){
					$result .= '<li>'.$this->geraArvore($saida).'</li>';
					//echo '	'.$producao.'['.$regra.']'.">\n";
					//$this->geraArvore($saida);
					//array_shift($saida);
				}else{
					if($producao=='î'){
						$result .= '<li>EPSILON</li>';
					}else{
						$result .= '<li>'.htmlentities($producao).'</li>';
					}
					
					//$this->geraArvore($saida);
					//echo '	'.$producao.'['.$regra.']'.">>\n";
					//array_shift($saida);
				}
			}
			$result .= '</ul>';
		}
		return $result;
	}
	
	public function geraArvoreParaYahooTree(&$saida, $pai){
		$result = '';
		if($saida!=null){
			$regra = array_shift($saida);
			$producoes = $this->regras[$regra];
			$nome = $this->regrasByName[$regra];
			$result = 'var '.$this->retiraMaiorEMenorQue($nome).$regra.' =  new YAHOO.widget.TextNode("'.$this->retiraMaiorEMenorQue($nome).'", '.$pai.', true);'."\n";
			for($i=0; $i< count($producoes); $i++) {
				$producao = $producoes[$i];
				if(in_array($producao, $this->regrasByName)){
					$result .= $this->geraArvoreParaYahooTree($saida, $this->retiraMaiorEMenorQue($nome).$regra);
				}else{
					if($producao=='î'){
						$result .= 'var epsilon =  new YAHOO.widget.TextNode("'.$producao.'", '.$this->retiraMaiorEMenorQue($nome).$regra.', true);'."\n";
					}else{
						$result .= 'var terminal =  new YAHOO.widget.TextNode("'.strtolower($producao).'", '.$this->retiraMaiorEMenorQue($nome).$regra.', true);'."\n";
					}
				}
			}
		}
		return $result;
	}
	
	private function retiraMaiorEMenorQue($elemento){
		$elemento1 = ereg_replace('<', '', $elemento);
		$elemento2 = ereg_replace('>', '', $elemento1);
		return $elemento2;
	}
	/**
	 * Cria uma lista de itens a serrem mostrados na tela baseado nas regras percorridas pela saida
	 * @param $regra int - regra a escrever.
	 * @return string
	 */
	public function criaArvore2($regra){
		$result = '';
		$regrasProducoes 	= $this->regras[$regra];
		$regrasNome			= $this->regrasByName[$regra];
		foreach ($regrasProducoes as $r) {
			if(in_array($r, $this->regrasByName)){//se for 
				$result = '<ul>'.$regrasNome.'<li>'.$this->geraArvore($elem).'</li></ul>';
			}else{
				$result = '<li>'.$elem.'</li>';
			}
		}
		return $result;
	}
	public function criaArvore(){
		$arvore = array();
		foreach ($this->saida as $r) {
			$regraTitulo= $this->regrasByName[$r];
			$regraDef	= $this->regras[$r];
			if(in_array($elem)){//se for 
				$result = '<ul>'.$elem.'<li>'.$this->geraArvore($elem).'</li></ul>';
			}else{
				$result = '<li>'.$elem.'</li>';
			}
		}
		return $arvore;
	}
	public function criaArvoreArray(){
		
	}
	
	public function getArvore(){
		return $this->arvore;
	}
	public function getArvoreYahoo(){
		return $this->arvoreYahoo;
	}
    
} // End Sintatico